#ifndef __PDIUSBD12_H__
#define __PDIUSBD12_H__

#include <at89x52.h>
#include "MyType.h"

// cmd addr and data addr
#define D12_COMMAND_ADDR 	1
#define D12_DATA_ADDR 		0

// PDIUSBD12 PIN define
#define D12_DATA 		P0      // 8bit数据总线
#define D12_A0 			P3_5    // 指令、数据线切换
#define D12_WR 			P3_6    // 写选通信号，低电平有效
#define D12_RD 			P3_7    // 读选通信号，低电平有效
#define D12_INT 		P3_2    // 中断信号

// select cmd or data addr
#define D12SetCommandAddr()		D12_A0 = D12_COMMAND_ADDR
#define D12SetDataAddr()		D12_A0 = D12_DATA_ADDR

// WR control
#define D12SetWr()	D12_WR = 1
#define D12ClrWr()	D12_WR = 0

// DR control
#define D12SetRd()	D12_RD = 1
#define D12ClrRd()	D12_RD = 0

// get interrupt state
#define D12GetIntPin()	D12_INT

// read/write data
#define D12GetData()		D12_DATA
#define D12SetData(Value)	D12_DATA = (Value)

// Set Data port input state
#define D12SetPortIn()		D12_DATA = 0xFF

// Set Data port output state
#define D12SetPortOut()

// D12 读ID命令 cmd
#define Read_ID						0xFD
#define PDIUSB_DEV_ID               0x1012

/** 设置模式第一字节：
 * mode[0]:0 保留
 * mode[0]:1 无懒时钟模式，总线挂起后CLKOUT不会切换到低时钟模式30KHZ
 * mode[0]:2 时钟运行，总线挂起后时钟停止，可以省电
 * mode[0]:3 中断模式，1：所有错误和NAK产生中断请求；0：只有传输正确才会产生中断请求；
 * mode[0]:4 软连接控制，上拉电阻控制，控制USB断通
 * mode[0]:5 保留
 * mode[0]:7~6 短点配置选择， 模式0~3， 模式0：端点1,2都是普通端点可以作中断和批量(bulk)端点
*/
/** 设置模式第二字节：
 * mode[1]:3~0 时钟分频系数
 * mode[1]:5~4 保留
 * mode[1]:6 该位必须为1
 * mode[1]:7 仅当SOF(起始帧)时才产生中断
*/
/**
 * 断开USB连接时第一字节： 0x06
 * 连接USB连接时第一字节： 0x16
 * 第二字节，分频最大，模式设置0： 0x47
*/
#define D12_SET_MODE  				0xF3
#define D12_READ_BUFFER  			0xF0
#define D12_WRITE_BUFFER  			0xF0
#define D12_CLEAR_BUFFER  			0xF2
#define D12_VALIDATE_BUFFER  		0xFA
#define D12_SET_ADDRESS_ENABLE 		0xD0
#define D12_SET_ENDPOINT_ENABLE		0xD8
#define D12_ACKNOWLEDGE_SETUP	  	0xF1
#define READ_INTERRUPT_REGISTER  	0xF4

// function declear
void D12WriteCommand(uint8_t);

uint8_t D12ReadByte(void);

void D12WriteByte(uint8_t Value);

uint16_t D12ReadID(void);

void DelayXms(uint16_t x);

void D12ClearBuffer(void);
uint8_t D12ReadEndPointBuffer(uint8_t Endp, uint8_t Len, uint8_t* buffer);
uint8_t D12WriteEndPointBuffer(uint8_t Endp, uint8_t Len, uint8_t *buffer);


uint8_t D12ReadEndPointLastStatus(uint8_t Endp);
void D12AcknowledgeSetup(void);
void D12SetAddress(uint8_t Addr);
void D12SetEndpointEnable(uint8_t Enable);


#endif

